#include <iostream>
#include <vector>
#include <unistd.h>
#include "Thread.hpp"
#include "LockGuard.hpp"

using namespace std;
using namespace yss;

pthread_mutex_t gmutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t gcond = PTHREAD_COND_INITIALIZER;

void *MasterCore(void *args)
{
    string name = static_cast<char *>(args);
    while (true)
    {
        sleep(1);
        cout << "主线程开始工作" << endl;
        pthread_cond_signal(&gcond);
        cout << "唤醒一个线程" << endl;
    }
    return nullptr;
}
void *SlaverCore(void *args)
{
    string name = static_cast<char *>(args);
    while(true)
    {
        pthread_mutex_lock(&gmutex);
        pthread_cond_wait(&gcond, &gmutex);
        cout << "线程在等待 " << name <<endl;
        pthread_mutex_unlock(&gmutex);
    }
}
void StartMaster(vector<pthread_t> *tidptr)
{
    pthread_t tid;
    int n = pthread_create(&tid, nullptr, MasterCore, (void *)"MasterThread");
    if (n == 0)
    {
        cout << "Master Thread create success" << endl;
    }
    tidptr->emplace_back(tid);
}
void StartSlaver(vector<pthread_t> *tidptr, int num)
{
    for (int i = 0; i < num; i++)
    {
        pthread_t tid;
        char *name = new char[64];
        snprintf(name, 64, "thread-%d", i + 1);
        int n = pthread_create(&tid, nullptr, SlaverCore, name);
        if (n == 0)
        {
            cout << "Slaver Thread create success" << endl;
        }
        tidptr->emplace_back(tid);
    }
}
void WaitAll(vector<pthread_t> tidptr)
{
    for(auto& thread:tidptr)
    {
        pthread_join(thread, nullptr);
    }
}
int main()
{
    vector<pthread_t> tids;
    StartMaster(&tids);
    StartSlaver(&tids, 5);
    WaitAll(tids);
    return 0;
}

// void *RunAtest(void* args)
// {
//     string name = static_cast<char*>(args);
//     while(true)
//     {
//         sleep(1);
//         cout << "Thread-A: 我是线程A" << endl;
//         pthread_cond_signal(&gcond);//唤醒
//     }
//     return nullptr;
// }
// void *RunBtest(void* args)
// {
//     string name = static_cast<char*>(args);
//     while(true)
//     {
//         pthread_mutex_lock(&gmutex);//加锁
//         pthread_cond_wait(&gcond, &gmutex);//等待
//         cout << "Thread-B: 我是线程B" << endl;

//         pthread_mutex_unlock(&gmutex);//解锁
//     }
//     return nullptr;
// }
// void StatrtAthread(vector<pthread_t> *tidptr)
// {
//     pthread_t tid;
//     int n = pthread_create(&tid, nullptr, RunAtest, (void*)"Thread-A");
//     if(n == 0)
//     {
//         cout << "Thread-A create success" << endl;
//     }
//     tidptr->emplace_back(tid);
// }
// void StatrtBthread(vector<pthread_t> *tidptr)
// {
//     pthread_t tid;
//     int n = pthread_create(&tid, nullptr, RunBtest, (void*)"Thread-B");
//     if(n == 0)
//     {
//         cout << "Thread-B create success" << endl;
//     }
//     tidptr->emplace_back(tid);
// }
// void WaitThreads(vector<pthread_t> &tidptr)
// {
//     for(auto& thread:tidptr)
//     {
//         pthread_join(thread, nullptr);
//     }
// }
// int main()
// {
//     vector<pthread_t> tids;
//     StatrtAthread(&tids);
//     StatrtBthread(&tids);
//     WaitThreads(tids);
//     return 0;
// }

// const int num = 4;
// static int g_tickets = 5000;

// class DataThread
// {
// public:
//     DataThread(int &ticket, const string &name, pthread_mutex_t &mutex)
//         : _ticket(ticket), _threadname(name), _mutex(mutex),_total(0)
//     {
//     }

//     ~DataThread()
//     {
//     }

//     int &_ticket;
//     string _threadname;
//     int _total;
//     pthread_mutex_t &_mutex;//竞争的是同一把锁
// };

// void route(DataThread *td)
// {
//     while (true)
//     {
//         LockGuard lg(&td->_mutex);
//         if(td->_ticket > 0)
//         {
//             usleep(1000);
//             printf("%s is run..., ticket: %d\n", td->_threadname.c_str(), td->_ticket);
//             td->_ticket--;
//             td->_total++;
//         }
//         else
//         {
//             break;
//         }
//     }
// }

// int main()
// {
//     vector<Thread<DataThread *>> threads;
//     vector<DataThread *> datas;
//     pthread_mutex_t mutex;
//     pthread_mutex_init(&mutex, nullptr);
//     for (int i = 0; i < num; i++)
//     {
//         string name = "thread-" + to_string(i + 1);
//         DataThread *td = new DataThread(g_tickets, name, mutex);
//         threads.emplace_back(route, td, name);
//         datas.emplace_back(td);
//     }
//     //创建
//     for(auto& thread:threads)
//     {
//         thread.Start();
//     }
//     //等待
//     for(auto& thread:threads)
//     {
//         thread.Join();
//     }
//     //打印每个线程获取的票数
//     for(auto& data:datas)
//     {
//         cout << data->_threadname << " total is: " << data->_total << endl;
//     }
//     pthread_mutex_destroy(&mutex);
//     return 0;
// }

// int num = 5;
// void print(int num)
// {
//     while(num--)
//     {
//         cout << "I am new thread, num: " << num << endl;
//         sleep(1);
//     }
// }
// int main()
// {
//     vector<Thread<int>> threads;
//     for(int i=0;i<num;i++)
//     {
//         string name = "thread-" + to_string(i+1);
//         threads.emplace_back(print, 10, name);
//     }
//     //
//     for(auto &thread:threads)
//     {
//         thread.Start();
//     }
//     //
//     for(auto &thread:threads)
//     {
//         thread.Join();
//         cout << "wait thread done, thread is: " << thread.name() << endl;
//     }
//     return 0;
// }